連載 / BSD をハックする一の リスト 5 static static static static static com-status-sched() void dkstat VOid cpustat void ifstat void memstat void loadave #define cursor(x,y) do{1cd-enq(Ox0c) ; - lcd-enq(x) ; lcd-enq(y) ; }whi1e(O) void com—status—sched ——P((void)) Struct com_softc *sc static int toggle; if (sc==NULL) return; if (lcd-deq() > = 0 ) { com—iflush(sc) ; first=l ; C om 1cd softc; lcd—flush() ; / * rewind ptr * / if(first ) { lcd—benq(lcdinit , first=0; com—status—init(sc) ; goto kickoff ; sizeof (lcdinit) ) ; cursor(O,0) ; cursor(7,0) ; cursor(O,1) ; cursor(O,2) ; cursor(O,3) ; cursor(19,3); loadave() ; memstat() ; ifstat() ; cpustat() ; dkstat() ; if ( ( toggle + + ) & 1 ) lcd—enq( ' lcd-putc(lcd—deq() ) ; ( 誌面の都合上、で折り返しています ) kickoff : 表示プログラム 1 秒ごとに呼び出される関数 com-status-sched() は、 今回はリスト 5 のようになります。 ます、前回の出力カ院了していなけオ L ば、シリアル入力 を空読みして初期化フラグ (first) をオンにします。 次に、出力バッフアをクリアします。 そして、初期化フラグがオンであれば、シリアルポート を匆月化して lcd に初期化データを送信します ( 送信バッ フアにネ川月化データ lcdinit を入れます ) 。 UNIX MAGAZINE 2001.12 あとは、 LCD のカーソルを 1 行目左端に動かしてロー ドアベレージを出力し、 7 カラム目からメモリの状態を出 力します。続いて、各行の知頁にカーソルを移動してネッ トワーク・インターフェイス、 CPU 、ディスク転送の状 いうよりは、棒か表示されたり消えたりするように見えま フのご利益があまり感しられません。棒かイ申ひ縮みすると ただし、ディスクに関しては変動か激しすぎて棒グラ ないなあ」と、 LCD を横目で見ています。 始めておいて、ほかの仕事をしながら「まだ make カ絲冬ら どがだいたい分かります。アプリケーションの make を しかし丘は、液品ディスプレイさえ見川ま負荷状態な リモートログインしてコマンドを叩く必要がありました。 出力を切り替えるか、ターミナル窓を開けて NetBSD に ています。そのため、 NetBSD 機の状態を知るには CRT 機を、コンソール切替器を使って 1 台の CRT に接続し 私は PC のほかにワークステーションなど数台の計算 かいい感しです。 に孑売して 2 カ月はど 24 時間運転していますが、なかな 今回紹介した液品表示器を、 NetBSD か稼動する PC 次回に説明します。 出力する 5 つの関数を書けは元成です。これらについては CPU 、ディスクのそれぞれの糸兤値を数値や棒グラフで あとは、ロードアベレージ、メモリ、ネットワーク、 おわりに れます。 出力してリターンします。 2 文字目以降は割込みで出力さ 最後に、出力バッフアの知頁の文字をシリアルポートに ータ生成は終ります。 そして、画面右下隅に、、 * " か空白を交互に出力してデ 態を出力します。 す。 99 ( さいとう・あきのり躑及大判
連載 / BSD をハックする一の リスト 4 LCD ネ化データ static u—char lcdinit ロ = { 0X09 , OxOa, 0X10 , 0X00 , 0x0e , Ox0e , 0xOe , 0x0e , OxOe , OxOe , OxOe , OxOe , OxOe , OxOe , OxOe , OxOe , OxOe , OxOe , Ox0e , 0xOe , 0X10 , 0X09 , 0X14 , 0X01 , 0X00 , Ox1F , 0X10 , 0X10 , 0x1F, 0X18 , 0X18 , Ox1F, Ox1c, Ox1c, Ox1F, Ox1e , Ox1e , Ox1F, Ox1f , 0x1f, 0x1f, 0X01 , 0X04 , OxOe , 0X00 , 0X00 , 0xOe , 0x0e , 0X00 , 0xOe , 0xOe, 0X00 , 0xOe , 0xOe , 0X00 , 0x0e , Ox0e , 0X00 , 0xOe , 0xOe , 0X00 , Ox0e , / * LCD size 20X4 * / 0X480 , 0X10 , 0X05 , 0X00 , 0X10 , 0X10 , 0X18 , 0X18 , 0x1c, 0x1c, 0x1e, 0x1e, 0x1f, Ox1f, 0X80 , 0X00 , Ox0e , Ox0e , 0x0e , OxOe , Ox0e , 0x0e , OxOe , Ox0e , OxOe , 0x0e , 0X10 , 0X00 , 0X10 , 0X10 , 0X18 , 0X18 , Ox1c, Ox1c, Ox1e, Ox1e, Ox1f , 0x1f , 0X05 , / * CG RAM ADDR O=char code 0 * / / * switch to DD RAM / * 5X7 dot bar * / / * 4X7 dot bar * / / * 3X7 dot bar * / / * 2X7 dot bar * / / * 1X7 dot bar * / / * 0X7 dot bar * / CLEAR SCREEN * / 3. LCD ュニットのアドレス空間を DDRAM に戻す。 (d)RS 入力を、、 1 " にする。 (c) アドレスカウンタ値十 0X80 をデータとして渡す。 (b)RS 入力を 0 にする。 CGRAM に切り替える。 (a)LCD ユニットのアドレス空間を DDRAM から 98 0 を使ってデータを出力するときには RS ビットを操作 ・ PIC はデータをそのまま LCD に渡すコマンド (0x0e) 出力する。 ると、 RSE ットを、 1 " にしたあと受け取ったデータを ・ PIC は 0X00 ~ 0X07 、 0x15—0xFF のデータを受け取 ピット 0 はアイドル時 1 、ビット 3 は 0 ・ RA ポートのうち意味のある出力ビットは 0 と 3 で、 トの値を変えてはならない。 ・ RA ポートは 8 ビットボートなので、 RA2 以、タ P ) ビッ トのビット 2 ) に接続されている。 ・ LCD ュニットの RS 入力は、 PIC の RA2 ()A ポー を突き合わせると、以下のことが分かります。 添付の回路図と PIC で動作しているプログラムのソース これを実現するためにはどうすればよいのでしようか。 しない。 ・ RB ポートは下位 4 ビットが LCD のデータの上位 4 るのは、 RS ピットか勝手にセットされるのを防ぐため ( > 0X15 ) を出力するのではなく、、 0x0e , 0X40 " としてい 設定するコマンド 0X40 を出力するときに、単純に 0X40 うデータをリスト 4 に示します。 CGRAM アドレスを LCD のネ月化とユーサー定義フォントの設定をおこな 必要。 操作もしてくれる。ただし、 RS ビットの値には注意が ムがビット入替えと 8 ピット→ 4 ビット出力 2 回の るほうが楽である。こちらを使えは、 PIC のプログラ 出力コマンド (0x0E に続いてデータバイト ) を利用す コマンド ( 0X00 ~ 0X07 、 0x15—0xFF) か、 1 ノヾイト PIC の RB ポート操作コマンドは使わず、データ出力 おり、 PIC のソースプログラムが正しい ) 。このため、 のビット入替えが必要になる国属の回路図は間違って 7 ではなく ) 5 、 4 、 7 、 6 に接続されているので、データ だし、ビット 0 、 1 、 2 、 3 がそれぞれビット ( 4 、 5 、 6 、 つ 2 回に分けて LCD ユニットに渡す必要がある。た ピットにつながっていて、 8 ビットデータは 4 ピットす です。 UNIX MAGAZINE 2001.12
連載 / BSD をハックする一の るアイドル状態なのか、アイドル状態でカーネルがハング アップしたのかの区別がっきません。 そこで、画面の開いた場所 ( 右ード隅 ) に * ( アスタリ スク ) を 1 秒澗隔で点滅させることにしました。 LCD 制御 前回は 1 行のデータと改行コードをそのまま流すだけで したが、今回は画面のカーソル移動とユーサー定義フォン ドノ ユーサー定義フォント クロ定義で言当できます ( リスト 5 参照 ) 。 マンドに続いて x 座標と y 座標を出力します。 Data RAM) のアドレスポインタの値設定 ) は、 LCD 画面上でのカーソル移動 (DDRAM (DispIay カーソル移動 ト機能が必要です。 これはマ 0x0C コ tor RAM) の望みの文字 ( 今回はコード 0 からなので 1. アドレスカウンタを、 CGRAM (Character Genera- 具イ勺な手順は以下のようになります。 があります。 タブタをバイバスして直接 LCD ュニットを操作する必要 この機能をサポートしていません。そのため、液品表示ア ンロード機能がありますが、シリアル液品表示アタフ。タは 今回使用している LCD ュニットにはフォント・ダウ から 5 に割り当てることにしました。 にするために、 0 / 5 ~ 5 / 5 幅の四角 ( ■ ) を文字コード 0 ペース ( 0X20 ) を使えはよいのですが、プログラムを簡略 の ( 1 文字のなかで左詰めの ) 四角が必要です。空白はス そのためには、 1 x 7 ドット ~ 5 x 7 ドットの 5 不頁 細かい棒グラフを表示しようと考えました。 定義フォントを使って、 1 文字をさらに 1 / 5 に区切った と、 10 段階の分解能しかありません。そこで、ユーザー 液品の 10 文字ぶんの場所を使って棒グラフを表示する UNIX MAGAZINE 2001.12 ト ) 回出力する。 2. グリフデータを文字数 x 8 バイト ( 1 文字は 5 x 8 (c)RS 入力を 1 にする。 から出力 ) 。 (b) アドレスカウンタ値をデータとして渡す ()B ポート (a)RS 入力を 0 にする。 0 ) にセットする。 SC 翡 好評発売中 ! インターネットの 起源 ・ Katie Hafner 、 Matthew Lyon 著 ・加地永都子、道田豪訳 ・ A5 判、 336 ページ •ISBN 4-7561-3479-3 ・本体 2 , 500 円 + 税 誤った“常識”を覆し、創設に携わった人びとの肉声を あますところなく伝える貴重な証言集 目次から 即断即決で 100 万ドル / 大聖堂を建てたのは誰か / 第 3 の 大学 / プログラムと格闘する日々 / トウルート宛必着 / ハッ キングと喧噪と / 電子メール / 手にしたロケット 参考文献、索引 Java プログラミング・ノート 国際化と 日本語処理 ・風間一洋著 ・ A5 判、 312 ページ ・ ISBN 4-7561-3481-5 ・本体 3 , 000 円十税 Java による日本語処理、さらには国際化プログラミング に必須の知識を数多くのサンプル・プログラムを示し ながら平易に解説する。真の意味での "Write Once, RunAnywhere ”を目指すプログラマーに最適の 1 冊。 目次から Java はどんな言語か / 国際化と地域イヒ / Unicode / ロケー ル / 工ンコーディング / タイムゾーン / リソースパンドル / フォ ーマット出力と解析 / 文字列の比較 / テキストの境界解析 / インブットメソッド / 文字の表示 付録 : Unicode プロック / ロケール一覧 / 工ンコーディング名 一覧 / タイムゾーン D 一覧 / ユーロ通貨記号への対応 株式会社アスキー Where Wizards 5 ね y up Late The Origins of The lnternet CAFE BABE 〒 1 5 1 ー 8024 東京都渋谷区代々木 4 ー 33 ー ] O 出版営業部 電話 (03) 5351 ー 8194 97